import sys
import time

from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QLabel, QScrollArea, QPushButton, QHBoxLayout, QWidget

from thread_多线程.qthread import SignalThread
from thread_多线程.signalEmitter import SignalEmitter


# 主线程负责窗口的展示
class MyWindow(QWidget):
    history_msg = list()

    def __init__(self):
        super().__init__()
        # 创建一个信号发射者
        self.emitter = SignalEmitter()
        # 创建一个线程,将信号发送者给他
        self.signal_thread = SignalThread(self.emitter, 2000)

        self.setWindowTitle("王多鱼web外挂 (qq:289024114)")
        self.resize(600, 200)
        self.init_ui()

    def init_ui(self):
        # 整体布局是垂直布局器
        self.container = QVBoxLayout()


        self.ql = QLabel()
        self.ql.resize(600, 15)
        self.ql.setWordWrap(True)  # 自动换行
        self.ql.setStyleSheet("background:pink")
        self.ql.setAlignment(Qt.AlignTop)

        # 创建一个滚动区域
        self.scroll = QScrollArea()
        self.scroll.setFixedSize(610,200)
        self.scroll.setWidget(self.ql)
        self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

        # 创建一个垂直布局器 用来添加自动滚动条
        self.qb = QVBoxLayout()
        self.qb.addWidget(self.scroll)

        self.btn1 = QPushButton("运行")
        self.btn1.setFixedSize(80, 30)

        # 停止按钮
        self.stop_btn = QPushButton("停止")
        self.stop_btn.setFixedSize(80, 30)
        self.stop_btn.hide()

        # 给按钮绑定槽函数
        self.btn1.clicked.connect(self.btn_click)
        self.stop_btn.clicked.connect(self.stop_btn_click)
        self.emitter.customSignal.connect(self.print_hello)

        # 创建一个水平布局器 用来存放按钮
        self.hb = QHBoxLayout()
        self.hb.addStretch(1)
        self.hb.addWidget(self.btn1)
        self.hb.addWidget(self.stop_btn)
        self.hb.addStretch(1)

        # 垂直布局器 水平布局器 设置到整体的窗口布局中
        self.container.addLayout(self.qb)
        self.container.addLayout(self.hb)
        self.setLayout(self.container)
        pass

    def stop_btn_click(self):
        print("stop qthread")
        # self.signal_thread.terminate() 这种会抛出一个SystemExits异常,可以在子线程中捕获该异常,从而可以安全的结束线程
        self.signal_thread.ifStop = True
        self.stop_btn.hide()
        self.btn1.show()

    def btn_click(self):
        # 执行work线程 将结果发送给 self customSignal
        self.signal_thread.ifStop = False
        self.signal_thread.start()
        if self.btn1.isVisible():
            self.btn1.hide()
            self.stop_btn.show()
        else:
            self.btn1.show()
            self.stop_btn.hide()

    def print_hello(self, msg):
        print(msg)
        self.history_msg.append(msg)
        self.ql.setText("<br/>".join(self.history_msg))
        self.ql.resize(600, self.ql.frameSize().height() + 15)
        self.ql.repaint()  # 更新内容,如果不更新可能没有显示新内容
        # 让右侧滚动条始终在底部
        self.scroll.verticalScrollBar().setValue(self.scroll.verticalScrollBar().maximum())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())
